/*********************************************************************************************************
 *
 *	模块名称 :Mv命令执行模块
 *	文件名称 :Mv_Command.c
 *	版    本 : V1.0
 *	说    明 :本模块在用户输入mv指令后开始执行。
 *
 *              注意事项：
 *                务必将编辑器的缩进参数和TAB设置为4来阅读本文件，以使得代码显示整齐。
 *
 *	修改记录 :
 *		版本号       日期         作者        说明
 *		V1.0     2022-05-09     zrx
 *
 *	Copyright (C), 2022-2030, xxxx
 *
 *********************************************************************************************************/

#include "../include/Mv_Command.h"

/*********************************************************************************************************
 *	函 数 名:Mv_Command
 *	功能说明:执行mv相关命令。
 *	形    参:string pointer array User content
 *  全局变量:无
 *	返 回 值:success 0    false -1
 *********************************************************************************************************/

int Mv_Command(char *abuf[20])
{
    if (abuf[1] && abuf[2])
    {
        FILE *msfp = fopen(abuf[1], "r");
        if (!msfp)
        {
            perror("source file not exist");
            return -1;
        }
        char sbuf[128];
        getcwd(sbuf, 128);
        int cd = chdir(abuf[2]); //判断目标是否为路径
        if (cd == -1)
        {
            FILE *mdfp = fopen(abuf[2], "w");
            if (!mdfp)
            {
                perror("Invalid dest format");
                return -1;
            }
            while (1)
            {
                char *mbuf = (char *)calloc(1, 1024);
                int frret = fread(mbuf, 1, 1024, msfp);
                if (!frret)
                {
                    break;
                }
                fwrite(mbuf, 1, frret, mdfp);
                free(mbuf);
                mbuf = NULL;
            }
            fclose(mdfp);
            remove(abuf[1]);
            fclose(msfp);
            return 0;
        }
        else
        {
            chdir(sbuf);
            char pbuf[128];
            char *p = "\0";
            int i = 0;
            while (*p != '/' && p != abuf[1]) //判断源与目标是否同一路径
            {
                p = *(abuf + 1) + strlen(abuf[1]) - 1 - i;
                ++i;
            }
            if (p == abuf[1])
            {
                strcpy(pbuf, "\0");
            }
            else
            {
                strcpy(pbuf, abuf[1]);
            }

            if (!(*pbuf) && (!strcmp(abuf[2], ".") || !strcmp(abuf[2], "./")))
            {
                printf("cp: \'%s\' and \'%s\' are the same file", abuf[1], abuf[1]);
                return -1;
            }
            else
            {
                if (p == abuf[1])
                {
                    if (*(*(abuf + 2) + strlen(abuf[2]) - 1) == '/')
                    {
                        strcat(abuf[2], p);
                    }
                    else
                    {
                        strcat(abuf[2], "/");
                        strcat(abuf[2], p);
                    }
                }
                else
                {
                    if (*(*(abuf + 2) + strlen(abuf[2]) - 1) == '/')
                    {
                        p++;
                        strcat(abuf[2], p);
                    }
                    else
                    {
                        strcat(abuf[2], p);
                    }
                }
                if (!strcmp(abuf[1], abuf[2]))
                {
                    printf("\'%s\'and\'%s\' are the same file", abuf[1], abuf[2]);
                    return -1;
                }
            }

            FILE *mdfp = fopen(abuf[2], "w");
            if (!mdfp)
            {
                perror("Invalid dest format");
                return -1;
            }
            while (1)
            {
                char *mbuf = (char *)calloc(1, 1024);
                int frret = fread(mbuf, 1, 1024, msfp);
                if (!frret)
                {
                    break;
                }
                fwrite(mbuf, 1, frret, mdfp);
                free(mbuf);
                mbuf = NULL;
            }

            fclose(mdfp);
            remove(abuf[1]);

            fclose(msfp);

            return 0;
        }
    }
    else
    {
        printf("invalid format\n");
        return -1;
    }
}